/**
 * 系统信息打印实验
 * 
 * 向控制台打印如下信息：
 * 1. CPU 架构信息以及操作系统
 * 2. 进程id信息
 * 3. NodeJS可执行文件路径
 * 4. 获取内存的使用情况
 */

const os = require('os');
const process = require('process');

console.log('=== 系统信息打印实验 ===\n');

// 1. CPU 架构信息以及操作系统
console.log('1. CPU 架构信息以及操作系统：');
console.log('操作系统类型：', os.type());
console.log('操作系统平台：', os.platform());
console.log('操作系统版本：', os.release());
console.log('操作系统架构：', os.arch());
console.log('主机名：', os.hostname());
console.log('CPU 架构：', process.arch);
console.log('CPU 核心数：', os.cpus().length);
console.log('CPU 信息：');
os.cpus().forEach((cpu, index) => {
    console.log(`  CPU ${index + 1}: ${cpu.model} (${cpu.speed}MHz)`);
});
console.log('');

// 2. 进程id信息
console.log('2. 进程id信息：');
console.log('当前进程ID：', process.pid);
console.log('父进程ID：', process.ppid);
console.log('进程标题：', process.title);
console.log('进程版本：', process.version);
console.log('Node.js 版本：', process.versions.node);
console.log('V8 引擎版本：', process.versions.v8);
console.log('');

// 3. NodeJS可执行文件路径
console.log('3. NodeJS可执行文件路径：');
console.log('Node.js 可执行文件路径：', process.execPath);
console.log('当前工作目录：', process.cwd());
console.log('脚本文件路径：', __filename);
console.log('脚本目录路径：', __dirname);
console.log('');

// 4. 获取内存的使用情况
console.log('4. 内存使用情况：');

// 系统内存信息
const totalMem = os.totalmem();
const freeMem = os.freemem();
const usedMem = totalMem - freeMem;

console.log('系统总内存：', (totalMem / 1024 / 1024 / 1024).toFixed(2) + ' GB');
console.log('系统可用内存：', (freeMem / 1024 / 1024 / 1024).toFixed(2) + ' GB');
console.log('系统已用内存：', (usedMem / 1024 / 1024 / 1024).toFixed(2) + ' GB');
console.log('内存使用率：', ((usedMem / totalMem) * 100).toFixed(2) + '%');

// 进程内存信息
const memUsage = process.memoryUsage();
console.log('\n当前进程内存使用情况：');
console.log('RSS (常驻内存)：', (memUsage.rss / 1024 / 1024).toFixed(2) + ' MB');
console.log('堆总内存：', (memUsage.heapTotal / 1024 / 1024).toFixed(2) + ' MB');
console.log('堆已用内存：', (memUsage.heapUsed / 1024 / 1024).toFixed(2) + ' MB');
console.log('外部内存：', (memUsage.external / 1024 / 1024).toFixed(2) + ' MB');
console.log('数组缓冲区：', (memUsage.arrayBuffers / 1024 / 1024).toFixed(2) + ' MB');

console.log('');

// 5. 其他系统信息
console.log('5. 其他系统信息：');
console.log('系统运行时间：', Math.floor(os.uptime() / 3600) + ' 小时');
console.log('用户信息：', os.userInfo());
console.log('网络接口：');
const networkInterfaces = os.networkInterfaces();
Object.keys(networkInterfaces).forEach(interfaceName => {
    console.log(`  ${interfaceName}:`);
    networkInterfaces[interfaceName].forEach(interface => {
        console.log(`    - ${interface.family}: ${interface.address} (${interface.internal ? '内部' : '外部'})`);
    });
});

console.log('');

// 6. 环境变量信息
console.log('6. 环境变量信息：');
console.log('NODE_ENV：', process.env.NODE_ENV || '未设置');
console.log('PATH：', process.env.PATH ? '已设置' : '未设置');
console.log('HOME：', process.env.HOME || process.env.USERPROFILE || '未设置');

console.log('\n=== 实验完成 ===');
